ποΈGitΠ―ΡΠ°ποΈ
Node / meshtastic / Meshtastic-Android / files / specs / 20260520-153449-node-list-context-menu / contracts / node-context-menu.md
specs/20260520-153449-node-list-context-menu/contracts/node-context-menu.md bd2863243bab6eb213401d949839a2bc74dde7e2 (bd286324) Text, 4.10 KB
UI Contract: NodeContextMenu
Component: T383838NodeContextMenu
Location: T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt
Interface
T282828
Tf0883e@Composable
Tff7b72fun Td2a8ffNodeContextMenuTb4b4b4(
Te6edf3expandedTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4,
Te6edf3onFavoriteTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onMuteTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onMessageTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onTraceRouteTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onIgnoreTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onRemoveTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4)
Rendered Structure (Canonical Order)
T282828
βββββββββββββββββββββββββββββββββββββββ
β DropdownMenuGroup (shapes) β
β ββ β Add to favorites β β position 1 (disabled if ignored)
β ββ π Mute notifications β β position 2 (hidden if !canMuteNode)
β ββ π¬ Message β β position 3 (disabled if ignored)
β ββ π Trace Route β β position 4 (disabled if ignored)
βββββββββββββββββββββββββββββββββββββββ€
β DropdownMenuGroup (shapes) β
β ββ π« Ignore β β position 5 (red, always enabled)
β ββ ποΈ Remove β β position 6 (red, disabled if ignored)
βββββββββββββββββββββββββββββββββββββββ
Behavioral Contract
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββ
β Scenario β Input State β Expected Behavior β
βββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββ€
β Normal node β T383838isIgnored=false, canMuteNode=true β All 6 items visible, all enabled β
β Ignored node β T383838isIgnored=true β Favorite, Message, Trace Route, Remove β¦ β
β Cannot mute β T383838canMuteNode=false β Mute item hidden; remaining 5 items in β¦ β
β Already favorite β T383838isFavorite=true β Shows "Remove from favorites" with fillβ¦ β
β Already muted β T383838isMuted=true β Shows "Unmute" with volume-off icon β
β Local node (self) β T383838node.num == ourNode.num β Menu NEVER shown (suppressed at call siβ¦ β
βββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββ
Callback Effects
ββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Callback β Action β
ββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β T383838onFavorite β Toggles node favorite status via T383838NodeManagementActions.requestFavoriteNode() β
β T383838onMute β Toggles node mute status via T383838NodeManagementActions.requestMuteNode() β
β T383838onMessage β Navigates to direct message conversation via T383838navigateToMessages(contactKey) β
β T383838onTraceRoute β Initiates traceroute request via T383838NodeRequestActions.requestTraceroute() β
β T383838onIgnore β Toggles node ignore status via T383838NodeManagementActions.requestIgnoreNode() β
β T383838onRemove β Removes node from mesh database via T383838NodeManagementActions.requestRemoveNode() β
ββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Accessibility
β’ Each T383838DropdownMenuItem gets automatic TalkBack semantics from M3 component
β’ T383838leadingIcon has T383838contentDescription = null (icon is decorative; text label is sufficient)
β’ Touch targets meet M3 minimum 48dp requirement (handled by T383838DropdownMenuItem)
Icons
βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββ
β Item β Icon β Condition β
βββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββ€
β Favorite β T383838MeshtasticIcons.Favorite / T383838MeshtasticIcons.NotFavorite β Based on T383838isFavorite β
β Mute β T383838MeshtasticIcons.VolumeUp / T383838MeshtasticIcons.VolumeOff β Based on T383838isMuted β
β Message β T383838MeshtasticIcons.Message β Always β
β Trace Route β T383838MeshtasticIcons.Route β Always β
β Ignore β T383838MeshtasticIcons.DoDisturb β Always (red tint) β
β Remove β T383838MeshtasticIcons.DeleteNode β Always (red tint) β
βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββββ
String Resources
ββββββββββββββββββββββ¬ββββββββββββββββββββββββββ¬βββββββββββββββ
β Resource Key β Value β Used When β
ββββββββββββββββββββββΌββββββββββββββββββββββββββΌβββββββββββββββ€
β T383838add_favorite β "Add to favorites" β T383838!isFavorite β
β T383838remove_favorite β "Remove from favorites" β T383838isFavorite β
β T383838mute_notifications β "Mute notifications" β T383838!isMuted β
β T383838unmute β "Unmute" β T383838isMuted β
β T383838message β "Message" β Always β
β T383838trace_route β "Trace Route" β Always (NEW) β
β T383838ignore β "Ignore" β T383838!isIgnored β
β T383838remove_ignored β "Remove from ignored" β T383838isIgnored β
β T383838remove β "Remove" β Always β
ββββββββββββββββββββββ΄ββββββββββββββββββββββββββ΄βββββββββββββββ
Served by rngit 1.5.0 - Generated in 0.05s